
/**
 * 一、普通的递归实现
 * 在遍历过程中发现数组元素还是数组的时候进行递归操作，把数组的结果通过数组的 concat 方法拼接到最后要返回的 result 数组上
 */
// function flatten(arr) {
//   let result = []
//   for (let i = 0; i < arr.length; ++i) {
//     if (Array.isArray(arr[i])) {
//       result = result.concat(flatten(arr[i]))
//     } else {
//       result.push(arr[i])
//     }
//   }
//   return result
// }

/**
 * 二、reduce迭代
 */
// function flatten(arr) {
//   return arr.reduce((prev, next) => {
//     return prev.concat(Array.isArray(next) ? flatten(next) : next)
//   }, [])
// }

/**
 * 三、扩展运算符实现
 * 扩展运算符和 some 的方法，两者共同使用
 * some来判断是否有数组,有就用拓展运算符展开.没有就结束
 */
// function flatten(arr) {
//   while (arr.some(item =>  Array.isArray(item))){
//     arr = [].concat(...arr)
//   }
//   return arr
// }

/**
 * 四、split 和 toString 共同处理
 * 数组会默认带一个 toString 的方法，
 * 把数组直接转换成逗号分隔的字符串，然后再用 split 方法把字符串重新转换为数组
 */
// function flatten(arr) {
//   return arr.toString().split(',')
// }

/**
 * 五、ES6 中的 flat
 * arr.flat([depth]),可以传进 Infinity
 */
// function flatten(arr) {
//   return arr.flat(Infinity)
// }

/**
 * 六、正则和 JSON 方法共同处理
 * 将 JSON.stringify 的方法先转换为字符串
 * 然后通过正则表达式过滤掉字符串中的数组的方括号
 * 最后再利用 JSON.parse 把它转换成数组
 */
function flatten(arr) {
  let tempString = JSON.stringify(arr)
  tempString = tempString.replace(/\[|\]/g, "")
  return JSON.parse(`[${tempString}]`)
}


let arr1 = [3, [1, [2, 4]]];
console.log(flatten(arr1));
